#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QtOpenGL>
#include <QGLWidget>

#include <glwidget.h>

#include <tracker.h>


struct jointLocations
{
    QString         name;
    Eigen::Vector3d pt_3D;
    Eigen::Vector2d pt_2D;
};


class GLWidget : public QGLWidget
{
    Q_OBJECT
public:
    explicit GLWidget(QWidget *parent = 0);

    bool trackerInitialized;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void initializeGL();
    void paintGL();
    void resizeGL(int w, int h);
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    int timeStep;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    Tracker  *tracker;

    void passVitalDataToGLWidget( Tracker *tracker_IN );
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void cameraTranslate( double dz            );
    void cameraTranslate( double dx, double dy );

    void cameraRotate(int mousePos_X, int mousePos_Y);

    Eigen::MatrixXd trackball(float p1x, float p1y, float p2x, float p2y);
    float           tb_project_to_sphere(float r,   float x,   float y);

    QPoint lastMousePos;

    Eigen::Vector4d spinCenter4D_curr;
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    QVector<int>    _myColorIndex;
    QVector<QColor> _myColors;

    QColor myColor_Mesh1;
    QColor myColor_Mesh2;
    QColor myColor_Mesh3;
    QColor myColor_MeshComp;
    QColor myColor_Left;
    QColor myColor_Right;
    QColor myColor_Aux1;
    QColor myColor__Hand;
    QColor myColor_Aux;
    QColor myColor__0;
    QColor myColor__1;
    QColor myColor__2;

    void myPickColor( int modelID, QString &boneName, QString alphaChooser );
    void myPartColor( int modelID, QString &boneName, QString alphaChooser );

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void passColors(          QVector<QColor> myColors               );
    void passColorIndexes(    QVector<int>    myColorIndex           );
    void passRenderCheckData( QVector<bool>   myCheckersForRendering );
    void passSkeletonType(    QString         mySkeletonType         );
    void passAlphaData(       QVector<double> myAlphaValues          );

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    QPainter painter;

    bool autoPlay;

    QString         _mySkeletonType;
    QVector<double> _myAlphaValues;

    bool _myRender_Mesh;
    bool _myRender_Skeleton;
    bool _myRender_LocalCoord;
    bool _myRender_FingerTipVertices;
    bool _myRender_FingerTipVert_CENTROID;
    bool _myRender_FingerTipDetections;
    bool _myRender_LeftRight_BoneLCS;
    bool _myRender_PCL_Points;
    bool _myRender_MESH_FILL;

    bool Skip_Video_forOneCycle;

    void OpenGL_Lights_Turn_ON();
    void OpenGL_Lights_Turn_OFF();

    void myRenderMesh();
    void myRender_PCL_Points();
    void myRender_PCL_Points( FeatureSet &FEAT, int camID );
    void myRenderSkeleton();
    void myRenderVideoBackground();
    void myRender_fingerTip_Detections();
    void myRender_HANDLE_LIGHTS_and_FilledNonFilled();

    int extractOne_Count;

    void myOpenGL_Flags();

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


private:
    QTimer timer;

private slots:

    void openGL_AutoPlay_SLOT(bool);

    void mouseMoveEvent(QMouseEvent *);
    void mousePressEvent(QMouseEvent *);
    void wheelEvent(QWheelEvent *);

    void extractOneFrame_SLOT();

signals:

    void openGL_AutoPlay_UpdUi_SIGNAL();

};

#endif // GLWIDGET_H
